package com.hsylient.javase.chapter11.demo11;

import java.util.ArrayList;
import java.util.List;

/**
 * 证明arrayList是一个不安全的集合
 *
 * 1.首先创建了一个ArrayList的对象，这个对象在堆内存中存放，所有的线程共享
 * 2.然后创建一个1000次循环，每一个次循环都创建一个新的线程，新线程要做的事情就是往集合中添加元素
 * 3.为了让这1000个线程都可以有充分的时间执行完，我们把主线程卡住5秒钟，因为list的大小是在主线程中输出的，太快了可能真的没有添加完全
 * 4.在主线程等待五秒以后发现输出的list的大小是一个不满1000的数组 （问题出现）
 *
 * 问题分析
 *      在往ArrayList中添加数据的时候，两个线程将数据添加到了同一个位置上，导致新的数据覆盖旧的数据
 *      因此总的数据量就减少了
 */
public class UnsafeArrayList {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            new Thread(() -> list.add(Thread.currentThread().getName())).start();
        }

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        System.out.println(list.size());
    }
}
